#ifndef JOS_KBDREG_H
#define JOS_KBDREG_H

// Special keycodes
#define KEY_HOME 0xE0
#define KEY_END 0xE1
#define KEY_UP 0xE2
#define KEY_DN 0xE3
#define KEY_LF 0xE4
#define KEY_RT 0xE5
#define KEY_PGUP 0xE6
#define KEY_PGDN 0xE7
#define KEY_INS 0xE8
#define KEY_DEL 0xE9

/* This is i8042reg.h + kbdreg.h from NetBSD. */

#define KBSTATP 0x64   /* kbd controller status port(I) */
#define KBS_DIB 0x01   /* kbd data in buffer */
#define KBS_IBF 0x02   /* kbd input buffer low */
#define KBS_WARM 0x04  /* kbd input buffer low */
#define KBS_OCMD 0x08  /* kbd output buffer has command */
#define KBS_NOSEC 0x10 /* kbd security lock not engaged */
#define KBS_TERR 0x20  /* kbd transmission error or from mouse */
#define KBS_RERR 0x40  /* kbd receive error */
#define KBS_PERR 0x80  /* kbd parity error */

#define KBCMDP 0x64         /* kbd controller port(O) */
#define KBC_RAMREAD 0x20    /* read from RAM */
#define KBC_RAMWRITE 0x60   /* write to RAM */
#define KBC_AUXDISABLE 0xa7 /* disable auxiliary port */
#define KBC_AUXENABLE 0xa8  /* enable auxiliary port */
#define KBC_AUXTEST 0xa9    /* test auxiliary port */
#define KBC_KBDECHO 0xd2    /* echo to keyboard port */
#define KBC_AUXECHO 0xd3    /* echo to auxiliary port */
#define KBC_AUXWRITE 0xd4   /* write to auxiliary port */
#define KBC_SELFTEST 0xaa   /* start self-test */
#define KBC_KBDTEST 0xab    /* test keyboard port */
#define KBC_KBDDISABLE 0xad /* disable keyboard port */
#define KBC_KBDENABLE 0xae  /* enable keyboard port */
#define KBC_PULSE0 0xfe     /* pulse output bit 0 */
#define KBC_PULSE1 0xfd     /* pulse output bit 1 */
#define KBC_PULSE2 0xfb     /* pulse output bit 2 */
#define KBC_PULSE3 0xf7     /* pulse output bit 3 */

#define KBDATAP 0x60 /* kbd data port(I) */
#define KBOUTP 0x60  /* kbd data port(O) */

#define K_RDCMDBYTE 0x20
#define K_LDCMDBYTE 0x60

#define KC8_TRANS 0x40    /* convert to old scan codes */
#define KC8_MDISABLE 0x20 /* disable mouse */
#define KC8_KDISABLE 0x10 /* disable keyboard */
#define KC8_IGNSEC 0x08   /* ignore security lock */
#define KC8_CPU 0x04      /* exit from protected mode reset */
#define KC8_MENABLE 0x02  /* enable mouse interrupt */
#define KC8_KENABLE 0x01  /* enable keyboard interrupt */
#define CMDBYTE (KC8_TRANS | KC8_CPU | KC8_MENABLE | KC8_KENABLE)

/* keyboard commands */
#define KBC_RESET 0xFF      /* reset the keyboard */
#define KBC_RESEND 0xFE     /* request the keyboard resend the last byte */
#define KBC_SETDEFAULT 0xF6 /* resets keyboard to its power-on defaults */
#define KBC_DISABLE \
  0xF5 /* as per KBC_SETDEFAULT, but also disable key scanning */
#define KBC_ENABLE 0xF4    /* enable key scanning */
#define KBC_TYPEMATIC 0xF3 /* set typematic rate and delay */
#define KBC_SETTABLE 0xF0  /* set scancode translation table */
#define KBC_MODEIND 0xED   /* set mode indicators(i.e. LEDs) */
#define KBC_ECHO 0xEE      /* request an echo from the keyboard */

/* keyboard responses */
#define KBR_EXTENDED 0xE0 /* extended key sequence */
#define KBR_RESEND 0xFE   /* needs resend of command */
#define KBR_ACK 0xFA      /* received a valid command */
#define KBR_OVERRUN 0x00  /* flooded */
#define KBR_FAILURE 0xFD  /* diagnosic failure */
#define KBR_BREAK 0xF0    /* break code prefix - sent on key release */
#define KBR_RSTDONE 0xAA  /* reset complete */
#define KBR_ECHO 0xEE     /* echo response */

#endif /* !JOS_KBDREG_H */
